package csu.fun.spring_store.persistence;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import csu.fun.spring_store.domain.Category;
import csu.fun.spring_store.domain.Product;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ProductMapper extends BaseMapper<Product> {



    @Select("SELECT * FROM product WHERE category = #{catid}")
    List<Product> selectBycatid(String catid);

    @Results({
            @Result(column = "productid", property = "productid"),
            @Result(column = "productid", property = "items",
                    many = @Many(select ="csu.fun.spring_store.persistence.ItemMapper.selectByproductid"))
    })
    @Select("SELECT * FROM product WHERE productid = #{id}")
    Product getProductById(String id);

    //判断是否存在指定id的product（productid不区分大小写）
    default boolean isExistProduct(String productid) {
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("productid", productid);
        return this.exists(queryWrapper);
    }

    //返回指定id的product
    default Product getProductByProductid(String productid) {
        return this.selectById(productid);
    }

    //插入一个新product，返回实际操作的行数。product不为null且productid必须不在数据库中存在，否则不进行任何修改
    default int setNewProduct(Product product) {
        if (product == null) {
            return 0;
        }
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("productid", product.getProductid());
        if (!this.exists(queryWrapper)) {
            return this.insert(product);
        }
        return 0;
    }

    //一次性更新整条记录，返回实际修改的行数。product不为null且productid必须已经在数据库中存在，否则不进行任何修改
    default int setExistProduct(Product product) {
        if (product != null) {
            return this.updateById(product);
        }
        return 0;
    }

    /*
      单独修改数据库中的某个值，返回实际修改的行数。productid必须已经在数据库中存在，否则不进行任何修改
     */
    //参数category必须在数据库中的category表中存在，否则会报错
    default int setCategoryByProductid(String productid, String category) {
        Product product = this.selectById(productid);
        if (product != null) {
            product.setCategory(category);
            return this.updateById(product);
        }
        return 0;
    }

    //更改库存数量
    default int setSumByProductid(String productid, String sum) {
        Product product = this.selectById(productid);
        if (product != null) {
            product.setSum(sum);
            return this.updateById(product);
        }
        return 0;
    }

    default int setNameByProductid(String productid, String name) {
        Product product = this.selectById(productid);
        if (product != null) {
            product.setName(name);
            return this.updateById(product);
        }
        return 0;
    }
    default int setDescnByProductid(String productid, String descn) {
        Product product = this.selectById(productid);
        if (product != null) {
            product.setDescn(descn);
            return this.updateById(product);
        }
        return 0;
    }

    //返回Category为特定值的所有product
    default List<Product> getProductsListByCategory(String category) {
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("category", category);
        return this.selectList(queryWrapper);
    }

    //删除指定id的product，返回实际修改的行数
    default int removeProductByProductid(String productid) {
        return this.deleteById(productid);
    }

}
